﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MathLib
{
    public class DemographyAlgorithms
    {
        // Количество периодов прогнозирования
        private int periodCount;
        // Количество возрастных групп в популяции
        private int groupCount;
        // Вектора состояний популяции по периодам
        private Matrix[] populationStates;
        // Матрицы перехода для соседних состояний
        private Matrix[] transitionMatrices;
        // Ошибка в векторе начальных состояний
        private double initialStateError;
        // Параметр матрицы ковариации входных шумов
        private double inputNoiseCovariation;
        // Параметр матрицы ковариации выходных шумов
        private double outputNoiseCovariation;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="populationStates">Вектора состояний популяции по периодам</param>
        /// <param name="transitionMatrices">Матрицы перехода для соседних состояний</param>
        /// <param name="initialStateError">Ошибка в векторе начальных состояний</param>
        /// <param name="inputNoiseCovariation">Параметр матрицы ковариации входных шумов</param>
        /// <param name="outputNoiseCovariation">Параметр матрицы ковариации выходных шумов</param>
        public DemographyAlgorithms(Matrix[] populationStates,
            Matrix[] transitionMatrices,
            double initialStateError,
            double inputNoiseCovariation,
            double outputNoiseCovariation)
        {
            if (populationStates == null || populationStates.Length == 0
                || transitionMatrices == null
                || populationStates.Length != transitionMatrices.Length + 1)
                throw new Exception("Некорректные данные");

            groupCount = -1;
            for (int i = 0; i < populationStates.Length; i++)
            {
                if (populationStates[i] == null || populationStates[i].NoCols != 1
                    || groupCount != -1 && populationStates[i].NoRows != groupCount)
                    throw new Exception("Некорректные данные");

                groupCount = populationStates[i].NoRows;
            }

            for (int i = 0; i < transitionMatrices.Length; i++)
                if (transitionMatrices[i] == null
                    || transitionMatrices[i].NoRows != groupCount
                    || transitionMatrices[i].NoCols != groupCount)
                    throw new Exception("Некорректные данные");

            periodCount = populationStates.Length;
            this.populationStates = populationStates;
            this.transitionMatrices = transitionMatrices;
            this.initialStateError = initialStateError;
            this.inputNoiseCovariation = inputNoiseCovariation;
            this.outputNoiseCovariation = outputNoiseCovariation;
        }
    }
}